#include        <stdio.h>
#include        <stdlib.h>
#include        <unistd.h>
#include        <fcntl.h>//宏和open
#define BUFFERSIZE      4096//存储器容量
#define COPYMODE        0644//复制长度
void oops(char *, char *);

int main(int argc, char *argv[])
{
int in_fd, out_fd, n_chars;//三个描述符值
char buf[BUFFERSIZE];

if (argc != 3) {
    fprintf(stderr, "usage: %s source destination\n", *argv);
    exit(1);
}
/*检查cp的第一个参数，要复制的文件，用open打开，in_fd为open返回的描述符*/
if ((in_fd = open(argv[1], O_RDONLY)) == -1)
    oops("Cannot open ", argv[1]);

/*检查cp的第二个参数，复制的目的地址，用create在目的地址创建新文件，out_fd为open返回的描述符*/
if ((out_fd = creat(argv[2], COPYMODE)) == -1)
    oops("Cannot creat", argv[2]);

/*cp指令的动作就是读取一个文件的内容到存储器，在新的地址创建空白文件，再从存储器将内容写入新文件。*/
while ((n_chars = read(in_fd, buf, BUFFERSIZE)) > 0)
    if (write(out_fd, buf, n_chars) != n_chars)
        oops("Write error to ", argv[2]);
if (n_chars == -1)
    oops("Read error from ", argv[1]);

if (close(in_fd) == -1 || close(out_fd) == -1)
    oops("Error closing files", "");
}

/*这个是用来输出错误信息的函数*/
void oops(char *s1, char *s2)
{
fprintf(stderr, "Error: %s ", s1);
perror(s2);
(stderr);
exit(1);
}
